Jyrki Gadinger [Wed, 4 Jun 2025 08:20:15 +0000 (10:20 +0200)]
fix(msi): set the REBOOT property in the MSI
A value of `ReallySuppress` will not display a reboot prompt whenever
the `ForceReboot` action was run, or whenever a reboot was scheduled
(e.g. by `FilesInUse`). Apparently this will not reboot the machine on
its own either.
`winget` sets this property in its manifest[0], and according to reports in
issue #5369 this seems to work.
See also: https://learn.microsoft.com/en-us/windows/win32/msi/reboot
Jyrki Gadinger [Wed, 21 May 2025 13:13:13 +0000 (15:13 +0200)]
fix(propagator): touch folder paths if permissions changed
Extra safeguard to ensure that the usage of
`FileSystem::setFolderPermissions` won't start a new sync run if
FolderWatcher/inotify detects a change in the file metadata...
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Jyrki Gadinger [Tue, 20 May 2025 17:25:53 +0000 (19:25 +0200)]
fix(filesystem): only change folder permissions if required
On Linux changing the permissions causes inotify to create a IN_ATTRIB
event -- even if the permissions stays the same.
Such an event is passed to the filesystem watcher which lets the client
schedule a new sync run. In certain conditions, this could happen
during every sync run...
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
fix(windows): when deleting a file use safe long windows path
will avoid getting a content access denied error because some paths is
too long for windows default limit and has to use the special syntax for
long path
see https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry
Jyrki Gadinger [Thu, 15 May 2025 14:11:38 +0000 (16:11 +0200)]
feat(mac-crafter): retry code-signing attempts
This step sometimes fails with an error such as: "A timestamp was
expected but was not found.". Any code-signing errors will result in
the notarisation step to fail.
Apparently this might be due to intermittent network issues. Let's just
retry codesigning a couple of times in the case it fails ...
See also: https://developer.apple.com/documentation/security/resolving-common-notarization-issues#Include-a-secure-timestamp
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Jyrki Gadinger [Mon, 28 Apr 2025 13:13:14 +0000 (15:13 +0200)]
fix(appimage): move VFS plugins to AppDir
This allows the AppImage build to find and load the experimental VFS
plugins, and not crash with:
[ critical plugins /home/user/src/common/vfs.cpp:250 ]: Could not load plugin: not existent or bad metadata "nextclouddevsync_vfs_suffix"
[ fatal default /home/user/src/gui/folderman.cpp:326 ]: Could not load plugin
[1] 72936 IOT instruction (core dumped) ./nextclouddev-master-x86_64.AppImage
Fixes #7135
Fixes #7194
Fixes #7465
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Jyrki Gadinger [Thu, 8 May 2025 12:23:40 +0000 (14:23 +0200)]
fix(msi): force termination of stuck processes
Stopping the Windows Explorer process does not always work. Per default
the MSI Restart Manager will display a warning message after a timeout,
and not attempt to restart Explorer afterwards -- resulting in a black
screen if no other window is open.
Setting the property `MSIRMSHUTDOWN` to `1` will force the termination
of the process when the timeout is reached, which finally allows the
Explorer to be restarted.
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Jyrki Gadinger [Wed, 7 May 2025 14:07:37 +0000 (16:07 +0200)]
fix(msi): do not completely remove the previous installation when updating
The MSIs we distribute perform so-called "major upgrades".
From the Microsoft docs, we learn that...
> A typical major upgrade **removes a previous version** of an
> application and installs a new version.
Indeed that was the case -- the previous version is uninstalled
completely before the new version gets installed. Since we install an
extension that's loaded by explorer, the installer will ask the user to
restart Windows Explorer during the uninstallation of the previous
version (and restarting that might not always work as expected).
There is a way to change this behaviour though, using Wix3's
`MajorUpgrade` element. Through its `Schedule` property it's possible
to define when the removal of the previous version should occur.
The previous value `afterInstallInitialize` is one of two values that
perform a complete uninstall/install sequence. The new value
`afterInstallExecute` will install new files on top of the previous
installation (depending on the `REINSTALLMODE` I guess) and remove
older files that are not present.
In the case of the extensions this means that the .dlls from the
previous installation will not be touched, as long as the version
embedded in the DLL info didn't change. This results in the installer
no longer requesting Windows Explorer to restart, which is a big plus :D
I also changed the REINSTALLMODE to `dmus` to allow downgrades as well.
With this change, the request to restart Windows Explorer should
hopefully happen only once an installation was made using an MSI that
contains this change. Further updates will only request a restart if
the DLL version of these extensions change...
See also:
- https://learn.microsoft.com/en-us/windows/win32/msi/major-upgrades
- https://docs.firegiant.com/wix/schema/wxs/majorupgrade/#attributes:~:text=Schedule
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Jyrki Gadinger [Thu, 17 Apr 2025 16:00:09 +0000 (18:00 +0200)]
fix(gui): handle invalid file name edge case on Windows
File names like "c:blah" would break the usage of the dialogue,
displaying a path like "c://blah" instead.
Apparently `QDir::filePath` checks if the passed file name is an
absolute file name using `!QFileInfo::isRelative`, which is the case if
the second character in the string is a colon -- probably indicating a
drive letter.
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Jyrki Gadinger [Thu, 24 Apr 2025 11:20:46 +0000 (13:20 +0200)]
fix(gui): resize share search results list dependent on required space
In the case there are more search results present than there's space for
it, always display a scrollbar. Some QtQuick themes don't make it
obvious that the list is scrollable.
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>